package cn.edu.zhku.citrusmonitor.baseinfo.citrus.service;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import cn.edu.zhku.citrusmonitor.util.ManagerThreadLocal;

/**
 * 动态代理封装事务
 * @author linyanbin
 *
 * 2018年7月19日上午10:37:56
 */
public class TransactionManager implements InvocationHandler{

	private Class<?> clazz;
	
	public Object newProxyInstance(Class<?> clazz) {
		this.clazz = clazz;
		return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
	}
	
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		// 获取实现类的方法
		Method implMethod = clazz.getMethod(method.getName(), method.getParameterTypes());
		// 获取方法上的注解
		NeedTransaction annotation = implMethod.getAnnotation(NeedTransaction.class);
		Object res = null;
		try {
			// 根据是否有注解判断是否开启事务管理
			if(annotation != null) {
				// 开启事务
				ManagerThreadLocal.startTransaction();
			}
			// 调用目标对象的业务逻辑方法
			res = method.invoke(clazz.newInstance(), args);
			if(annotation != null) {
				// 提交事务
				ManagerThreadLocal.commit();
			}
		} catch (Exception e) {
			// 事务回滚
			ManagerThreadLocal.rollback();
			e.printStackTrace();
		} finally {
			ManagerThreadLocal.close();
		}
		return res;
	}
	
}
